package bitset;

/**
 * @ClassName BitSet
 * @Description 位图
 * @Author ZJX
 * @Date 2024/9/25 20:31
 * @Version 1.0
 */
public class BitSet {
    public int[] set;

    // 初始化位图，n 是要存储的最大数字
    public BitSet(int n){
//         如果 a/b想 向上取整  改写成 (a + b - 1)/b;
        this.set = new int[(n + 31) / 32];
    }

    // 将一个数字 num 添加到位图中
    public void add(int num){
        // num / 32 确定对应的整型数，num % 32 找到具体的位，使用位或操作设定该位为1
        set[num / 32] |= 1 << (num % 32);
    }

    // 判断一个数字是否存在
    public boolean contains(int num) {
        // 判断位图中相应的位置是否为1，使用按位与操作
        return (set[num / 32] & (1 << (num % 32))) != 0;
    }

//    从位图中移除一个数字，即将对应的位从1重置为0
    public void remove(int num) {
        // num / 32 确定在哪个整数中，num % 32 确定具体哪一位，使用按位与操作和取反来清除该位
        set[num / 32] &= ~(1 << (num % 32));
    }


}
